package com.song.util;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;

/**
 * CSV输出器
 */
public class CSVWriter {	
	/**
	 * 实例化CSV输出器
	 * @param pw 输出器
	 * @param separator 分隔符
	 * @param quote 引用符
	 */
	public CSVWriter(Writer pw, String separator, char quote, boolean trim) {
		// 设置 Writer
		if (pw instanceof PrintWriter) {
			this.pw = (PrintWriter)pw;
		} else {
			this.pw = new PrintWriter(pw);
		}
		if (this.pw == null) {
			// invalid writer
			throw new IllegalArgumentException("无效的 Writer");
		}
		// 设置 分隔符，引用符
		this.separator = separator;
		this.quote = quote;
		// 设置 布尔参数
		this.trim = trim;
		this.isPrintSeparator = false;
	}
	
	/**
	 * 实例化CSV输出器
	 * @param pw 输出器
	 */
	public CSVWriter(Writer pw) {
		this(pw, "|", ' ', true);
	}
	
	/**
	 * 实例化CSV输出器
	 * @param filePath 文件路径
	 * @throws IOException
	 */
	public CSVWriter(String filePath) throws IOException {
		this(new FileWriter(filePath));
	}
	
	/*
	 * 输出器
	 * Writer 的 子类
	 */
	private PrintWriter pw;
	
	/*
	 * 分隔符
	 * 一般使用","分割
	 */
	private String separator;
	
	/*
	 * 引用符
	 * 一般使用"""
	 */
	private char quote;
	
	/*
	 * 去除字符串空格
	 */
	private boolean trim;
	
	/*
	 * 是否打印分割符
	 * 换行后不打印
	 */
	private boolean isPrintSeparator;
	
	/**
	 * 检查
	 */
	public void check() {
		if (pw == null) {
			throw new IllegalArgumentException("无法使用已关闭的 CSVWriter");
		}
	}
	
	/**
	 * 换行
	 */
	public void enter() {
		check();
		// 换行
		pw.print("\r\n");
		isPrintSeparator = false;
	}
	
	/**
	 * 输出单元格
	 * @param msg 单元格信息
	 */
	public void cell(String msg) {
		check();
		
		// 消除null字符串
		if (msg == null) {
			msg = "";
		}
		// 去除空格
		if (trim) {
			msg = msg.trim();
		}

		// 打印分隔符
		if (isPrintSeparator) {
			pw.print(separator);
		}
		// 打印信息
		if (msg.indexOf(quote) != -1) {
			// 信息内存在引用符
			//pw.print(quote);
			for (char ch:msg.toCharArray()) {
//				System.out.println("转义: " + quote + " : " + ch);
				if (ch == quote) {
					// 引用转义
					//pw.print(quote);
					//pw.print(quote);
				} else {
					// 常规输出
					pw.print(ch);
				}
			}
			//pw.print(quote);s
		} else {
			// contains separator & normal print
			//pw.print(quote);
			pw.print(msg);
			//pw.print(quote);
		}
		isPrintSeparator = true;
	}
	
	/**
	 * 关闭CSV输出器
	 */
	public void close() {
		if (pw != null) {
			pw.flush();
			pw.close();
			pw = null;
		}
		System.gc();
	}


	public static void main(String[] args) {
		try {

			CSVWriter csv = new CSVWriter(new FileWriter("c:\\temp_csv.csv"));
			
			csv.enter();
			csv.cell("测试");
			csv.cell("单元格");
			csv.cell("信息");
			csv.enter();
			csv.cell("a,b,c");
			csv.cell("\"\"\"");
			csv.cell("gaf#,mj%a//");
			
			csv.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
